import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/foundation.dart';

class ThoughtAnalysis {
  final List<String> distortionLabels;
  final int emotionalIntensity;

  ThoughtAnalysis({
    required this.distortionLabels,
    required this.emotionalIntensity,
  });
}

class DeepseekService {
  static const String apiUrl = 'https://ark.cn-beijing.volces.com/api/v3/chat/completions';
  static const String apiKey = '5784ddec-476a-402c-becf-addeb06eb54e';
  static const String modelId = 'deepseek-v3-241226';

  void _debugPrint(String title, dynamic content) {
    if (kDebugMode) {
      print('=== $title ===');
      print(content);
      print('=============');
    }
  }

  String _decodeUtf8(String text) {
    try {
      List<int> bytes = text.codeUnits;
      return utf8.decode(bytes);
    } catch (e) {
      return text;
    }
  }

  Future<ThoughtAnalysis> analyzeThought(String thought) async {
    try {
      _debugPrint('发送想法分析请求', thought);

      final response = await http.post(
        Uri.parse(apiUrl),
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer $apiKey',
        },
        body: jsonEncode({
          'model': modelId,
          'messages': [
            {
              'role': 'system',
              'content': '''
你是一位专业的心理咨询师，擅长认知行为疗法（CBT）。请分析用户输入的想法，识别其中的认知扭曲类型和情绪强度。
请按以下格式返回JSON：
{
  "distortion_labels": ["认知扭曲类型1", "认知扭曲类型2"],
  "emotional_intensity": 情绪强度（1-10的整数）
}

认知扭曲类型包括：
- 非黑即白思维
- 过度概括化
- 心理过滤
- 否定正面思维
- 跳跃式结论
- 放大或缩小
- 情绪化推理
- "应该"陈述
- 贴标签
- 归因错误

注意：
1. 每个想法最多识别3种认知扭曲类型
2. 情绪强度评分标准：1-3分为轻度，4-7分为中度，8-10分为重度
3. 只返回JSON格式数据，不要包含其他文字说明
'''
            },
            {
              'role': 'user',
              'content': thought,
            }
          ]
        }),
      );

      _debugPrint('API响应状态码', response.statusCode.toString());
      _debugPrint('API响应内容', response.body);

      if (response.statusCode == 200) {
        final jsonResponse = jsonDecode(response.body);
        final content = jsonResponse['choices'][0]['message']['content'];
        _debugPrint('AI返回内容', content);
        
        final decodedContent = _decodeUtf8(content);
        _debugPrint('解码后的内容', decodedContent);
        
        final analysis = jsonDecode(decodedContent);
        _debugPrint('解析后的分析', analysis);

        return ThoughtAnalysis(
          distortionLabels: List<String>.from(analysis['distortion_labels'].map((label) => _decodeUtf8(label))),
          emotionalIntensity: analysis['emotional_intensity'],
        );
      } else {
        throw Exception('API请求失败: ${response.statusCode}\n${response.body}');
      }
    } catch (e, stackTrace) {
      _debugPrint('分析失败', '$e\n$stackTrace');
      throw Exception('分析失败: ${e.toString()}');
    }
  }

  Future<String> _sendRequest(String prompt) async {
    final response = await http.post(
      Uri.parse(apiUrl),
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer $apiKey',
      },
      body: jsonEncode({
        'model': modelId,
        'messages': [
          {
            'role': 'system',
            'content': prompt
          },
          {
            'role': 'user',
            'content': 'Please provide your response.',
          }
        ]
      }),
    );

    _debugPrint('API响应状态码', response.statusCode.toString());
    _debugPrint('API响应内容', response.body);

    if (response.statusCode == 200) {
      final jsonResponse = jsonDecode(response.body);
      final content = jsonResponse['choices'][0]['message']['content'];
      _debugPrint('AI返回内容', content);
      
      return _decodeUtf8(content.trim());
    } else {
      throw Exception('API请求失败: ${response.statusCode}\n${response.body}');
    }
  }

  Future<String> getNextQuestion(String thought, List<String> previousAnswers) async {
    final prompt = '''
你是一位专业的认知行为疗法(CBT)治疗师。我需要你根据用户的消极想法，按照以下三问法的顺序提供一个问题：

1. 第一问 - 事实核查：引导用户区分事实和猜测，寻找支持和反对的客观证据
2. 第二问 - 可能性探索：帮助用户跳出单一负面解释，探索其他合理可能性
3. 第三问 - 成本效益分析：引导用户思考持续这种想法的影响，以及换个角度思考的好处

规则：
1. 严格按照问题顺序，根据用户已回答的数量返回下一个问题
2. 使用开放式提问，避免是非题
3. 问题要具体、明确，直击认知扭曲核心
4. 语气要温和、专业、不带评判
5. 直接返回问题文本，不要包含任何其他内容或格式

用户的消极想法是：$thought

${previousAnswers.isNotEmpty ? "用户之前的回答：\n${previousAnswers.join('\n')}\n" : ""}

请根据用户已回答的数量，生成下一个问题。
''';

    try {
      final response = await _sendRequest(prompt);
      return response;
    } catch (e) {
      print('Error getting next question: $e');
      rethrow;
    }
  }

  Future<Map<String, String>> generateFinalAnalysis(String thought, List<String> answers) async {
    final prompt = '''
你是一位专业的认知行为疗法(CBT)治疗师。基于用户的消极想法和反思过程，请生成一个完整的分析报告。

消极想法：$thought

反思过程：
${answers.map((a) => "- $a").join('\n')}

请生成以下三个部分的内容，并以JSON格式返回。每个字段必须是单个字符串（不能是数组），格式如下：
{
  "positive_thought": "这里是一段完整的积极想法文本",
  "balanced_view": "这里是一段完整的平衡观点文本",
  "action_plan": "这里是一段完整的行动计划文本，如果有多个步骤用数字编号"
}

要求：
1. 积极想法：
- 基于用户的反思，提供一个更理性、积极的替代想法
- 保持具体和实际，避免过度乐观
- 要有同理心，认可感受的同时指出新的视角
- 必须是一段完整的文字，不要用列表格式
- 积极想法的视角一定要以“我”的视角生成
- 积极想法回复的字数限制在20个字以内

2. 平衡观点：
- 综合用户的反思，提供一个更全面、客观的情况分析
- 既要承认困难，也要看到希望
- 用温和的语气，避免说教
- 必须是一段完整的文字，不要用列表格式

3. 行动计划：
- 提供3个具体、可执行的行动建议
- 建议要循序渐进，从小目标开始
- 要考虑用户的实际情况，确保可行性
- 如果有多个步骤，直接用数字编号，不要用列表格式

注意：
1. 必须严格按照指定的JSON格式返回
2. 每个字段必须是单个字符串，不能是数组
3. 不要包含任何其他内容或格式
4. 如果有多个要点，请将它们合并成一段完整的文字，可以用数字编号
''';

    try {
      final response = await _sendRequest(prompt);
      return _parseAnalysis(response);
    } catch (e) {
      print('Error generating final analysis: $e');
      rethrow;
    }
  }

  Map<String, String> _parseAnalysis(String response) {
    try {
      final analysis = jsonDecode(response);
      _debugPrint('解析后的分析', analysis);
      
      // 确保每个字段都是字符串类型
      String ensureString(dynamic value) {
        if (value is List) {
          return value.join('\n');
        }
        return value?.toString() ?? '';
      }
      
      return {
        'positive_thought': _decodeUtf8(ensureString(analysis['positive_thought'])),
        'balanced_view': _decodeUtf8(ensureString(analysis['balanced_view'])),
        'action_plan': _decodeUtf8(ensureString(analysis['action_plan'])),
      };
    } catch (e) {
      print('Error parsing analysis: $e');
      rethrow;
    }
  }
} 